home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / amap.nasl < prev    next >
Text File  |  2005-03-31  |  8KB  |  265 lines

  1. #TRUSTED 011297d42dd1f9e458f7ddb9d3117a52e0149a2355c0d4e8e05f8040d98e8df1fb30f7b8f98b503a1f239d6aa826c67e3cb4205f3a4ae7bb52bd0dabbdd408dc4c417ad84674ec0a279f33f2e1d68e12461bef50fae5b2b9e8074ac8ff0a071d79be783c62349dd13ee7a2a6d369d5fcd3e5c53aa1db34483b96c6b5e865b513f765d22b7cab63a90b006d6037abc751334f5c755219e873a04c41b9df221c05dbe10882eb5829f581d737c2a896b03dd2092987137509cd5d28692a93c464b5cdb585a647f24e96afb96e56eca6e197ba6d3d46f02903f959b1b7cf04304c9400d02dd370078f0042a3470a14e5382bd15c49ee24a1e7725a710277fe375c14e1478ea5737efccb2d9551361e001860977d6759b65fb2285610ce4f8e204b52e6e3f3ea9e14790ad9d4dfafe2bc66bcc211bf095cb0ed9fdd8160124c39c0fb6de97173302e5d64db9b3751f994c7e27620537132ed027e91931ea55531572f2b06d540ff896a2d0351feebe23ac2c9bf6107252bde27dda4cb6ab43f2826757e8d9cd95bf3ba03dc794c17049dd65cefde19a6e1e244fb7aa42de914e4e9dfbc3bca93f76dba4d922e39c3679d669c31016d5e50e3b08d53e14be053ccfb945200b5123135f6fd3654563c0243d91e5a136bf43731a59469db2817fc835d31d3f5354b6e289608064381dbf54559c094ee4ca35ea914a428910b9240b552f5
  2. #
  3. # This script was written by Michel Arboi <arboi@alussinan.org>
  4. #
  5. # GPL
  6. #
  7. if ( ! defined_func("pread") || ! defined_func("fread") ||
  8.      ! defined_func("get_preference") ) exit(0);
  9. if ( ! find_in_path("amap") ) exit(0);
  10.  
  11.  
  12. if(description)
  13. {
  14.  script_id(14663);
  15.  script_version ("1.10");
  16.  name["english"] = "amap (NASL wrapper)";
  17.  script_name(english:name["english"]);
  18.  
  19.  desc["english"] = "
  20. This plugin runs amap to find open ports and identify applications.
  21. See the section 'plugins options' to configure it
  22.  
  23. ";
  24.  
  25.  script_description(english:desc["english"]);
  26.  
  27.  summary["english"] = "Performs portscan / RPC scan / application recognition";
  28.  script_summary(english:summary["english"]);
  29.  
  30.  script_category(ACT_SCANNER);
  31.  
  32.  script_copyright(english:"This script is Copyright (C) 2004 Michel Arboi");
  33.  family["english"] = "Port scanners";
  34.  family["francais"] = "Scanners de ports";
  35.  script_family(english:family["english"], francais:family["francais"]);
  36.  
  37.  script_dependencies("ping_host.nasl");
  38.  
  39.  if (NASL_LEVEL < 2181) exit(0);    # Cannot run
  40.  
  41.  script_add_preference(name: "File containing machine readable results : ", value: "", type: "file");
  42.  
  43.  script_add_preference(name:"Mode", type:"radio", value: "Map applications;Just grab banners;Port scan only");
  44.  script_add_preference(name:"Quicker", type:"checkbox", value: "no");
  45.  script_add_preference(name:"UDP scan (disabled in safe_checks)", type:"checkbox", value: "no");
  46.  script_add_preference(name:"SSL (disabled in safe_checks)", type:"checkbox", value: "yes");
  47.  script_add_preference(name:"RPC (disabled in safe_checks)", type:"checkbox", value: "yes");
  48.  
  49.  script_add_preference(name:"Parallel  tasks", type:"entry", value: "");
  50.  script_add_preference(name:"Connection retries", type:"entry", value: "");
  51.  script_add_preference(name:"Connection timeout", type:"entry", value: "");
  52.  script_add_preference(name:"Read timeout", type:"entry", value: "");
  53.  
  54.  exit(0);
  55. }
  56.  
  57. #
  58. function hex2raw(s)
  59. {
  60.  local_var i, j, ret, l;
  61.  
  62.  s = chomp(s);  # remove trailing blanks, CR, LF...
  63.  l = strlen(s);
  64.  if (l % 2) display("hex2raw: odd string: ", s, "\n");
  65.  for(i=0;i<l;i+=2)
  66.  {
  67.   if(ord(s[i]) >= ord("0") && ord(s[i]) <= ord("9"))
  68.         j = int(s[i]);
  69.   else
  70.         j = int((ord(s[i]) - ord("a")) + 10);
  71.  
  72.   j *= 16;
  73.   if(ord(s[i+1]) >= ord("0") && ord(s[i+1]) <= ord("9"))
  74.         j += int(s[i+1]);
  75.   else
  76.         j += int((ord(s[i+1]) - ord("a")) + 10);
  77.   ret += raw_string(j);
  78.  }
  79.  return ret;
  80. }
  81.  
  82. if (NASL_LEVEL < 2181 || ! defined_func("pread") || ! defined_func("get_preference"))
  83. {
  84.   set_kb_item(name: "/tmp/UnableToRun/14663", value: TRUE);
  85.   display("Script #14663 (amap_wrapper) cannot run - upgrade libnasl\n");
  86.   exit(0);
  87. }
  88.  
  89. function on_exit()
  90. {
  91.   if (tmpnam) unlink(tmpnam);
  92. }
  93.  
  94. __gs_opt = get_kb_item("global_settings/experimental_scripts");
  95. if (! COMMAND_LINE && "yes" >!< __gs_opt)
  96. {
  97.  display('amap.nasl is an "experimental script". Disabled\n');
  98.  exit(0);
  99. }
  100.  
  101.  
  102. ip = get_host_ip();
  103. esc_ip = ""; l = strlen(ip);
  104. for (i = 0; i < l; i ++) 
  105.   if (ip[i] == '.')
  106.     esc_ip = strcat(esc_ip, "\.");
  107.   else
  108.     esc_ip = strcat(esc_ip, ip[i]);
  109.  
  110. res = script_get_preference_file_content("File containing machine readable results : ");
  111. if (res)
  112.   res = egrep(pattern: "^" + esc_ip + ":[0-9]+:", string: res);
  113. if (! res)
  114. {
  115. # No result, launch amap
  116. tmpdir = get_tmp_dir();
  117. if ( ! tmpdir ) exit(0);
  118. tmpnam = strcat(tmpdir, "amap-", get_host_ip(), "-", rand());
  119.  
  120. p = script_get_preference("UDP scan");
  121. if ("yes" >< p)
  122.  udp_n = 1;
  123. else
  124.  udp_n = 0;
  125.  
  126. n_ports = 0;
  127.  
  128. for (udp_flag = 0; udp_flag <= udp_n; udp_flag ++)
  129. {
  130.  i = 0;
  131.  argv[i++] = "amap";
  132.  argv[i++] = "-q";
  133.  argv[i++] = "-U";
  134.  argv[i++] = "-o";
  135.  argv[i++] = tmpnam;
  136.  argv[i++] = "-m";
  137.  if (udp_flag) argv[i++] = "-u";
  138.  
  139.  p = script_get_preference("Mode");
  140.  if ("Just grab banners" >< p) argv[i++] = '-B';
  141.  else if ("Port scan only" >< p) argv[i++] = '-P';
  142.  else argv[i++] = '-A';
  143.  
  144.  # As all UDP probes are declared harmful, -u is incompatible with -H
  145.  # Amap exits immediatly with a strange error.
  146.  # I let it run just in case some "harmless" probes are added in a 
  147.  # future version
  148.  
  149.  if (safe_checks()) argv[i++] = "-H";
  150.  
  151.  p = script_get_preference("Quicker");
  152.  if ("yes" >< p) argv[i++] = "-1";
  153.  
  154.  # SSL and RPC probes are "harmful" and will not run if -H is set
  155.  
  156.  p = script_get_preference("SSL");
  157.  if ("no" >< p) argv[i++] = "-S";
  158.  p = script_get_preference("RPC");
  159.  if ("no" >< p) argv[i++] = "-R";
  160.  
  161.  p = script_get_preference("Parallel  tasks"); p = int(p);
  162.  if (p > 0) { argv[i++] = '-c'; argv[i++] = p; }
  163.  p = script_get_preference("Connection retries"); p = int(p);
  164.  if (p > 0) { argv[i++] = '-C'; argv[i++] = p; }
  165.  p = script_get_preference("Connection timeout"); p = int(p);
  166.  if (p > 0) { argv[i++] = '-T'; argv[i++] = p; }
  167.  p = script_get_preference("Read timeout"); p = int(p);
  168.  if (p > 0) { argv[i++] = '-t'; argv[i++] = p; }
  169.  
  170.  argv[i++] = ip;
  171.  pr = get_preference("port_range");
  172.  if (! pr) pr = "1-65535";
  173.  foreach p (split(pr, sep: ',')) argv[i++] = p;
  174.  
  175.  res1 = pread(cmd: "amap", argv: argv, cd: 1, nice: 5);
  176.  res = fread(tmpnam);
  177. }
  178.  
  179. # IP_ADDRESS:PORT:PROTOCOL:PORT_STATUS:SSL:IDENTIFICATION:PRINTABLE_BANNER:FULL_BANNER
  180.  
  181.  foreach line(split(res))
  182.  {
  183.   v = eregmatch(string: line, pattern: '^'+esc_ip+':([0-9]+):([^:]*):([a-z]+):([^:]*):([^:]*):([^:]*):(.*)$');
  184.   if (! isnull(v) && v[3] == "open")
  185.   {
  186.    scanner_status(current: ++ n_ports, total: 65535 * 2);
  187.    port = int(v[1]); ps = string(port);
  188.    proto = v[2];
  189.    scanner_add_port(proto: proto, port: port);
  190.    # As amap sometimes give several results on a same port, we save 
  191.    # the outputs and remember the last one for every port
  192.    # The arrays use a string index to save memory
  193.    amap_ident[ps] = v[5];
  194.    amap_proto[ps] = proto;
  195.    amap_ssl[ps] = v[4];
  196.    amap_print_banner[ps] = v[6];
  197.    amap_full_banner[ps] = v[7];
  198.  
  199.   }
  200.  }
  201. }
  202.  
  203. set_kb_item(name: "Host/scanned", value: n_ports != 0);
  204.  
  205. if (udp_n && n_ports)
  206.   set_kb_item(name: "Host/udp_scanned", value: 1);
  207.  
  208. scanner_status(current: 65535 * 2, total: 65535 * 2);
  209.  
  210. function cvtbanner(b)
  211. {
  212.   local_var i, l, x;
  213.   l = strlen(b);
  214.  
  215.   if (b[0] == '0' && b[1] == 'x')
  216.    return hex2raw(s: substr(b, 2));
  217.  
  218.   x = "";
  219.   for (i = 0; i < l; i ++)
  220.    if (b[i] != '\\')
  221.     x += b[i];
  222.    else
  223.    {
  224.     i++;
  225.     if (b[i] == 'n') x += '\n';
  226.     else if (b[i] == 'r') x += '\n';
  227.     else if (b[i] == 't') x += '\t';
  228.     else if (b[i] == 'f') x += '\f';
  229.     else if (b[i] == 'v') x += '\v';
  230.     else if (b[i] == '\\') x += '\\';
  231.     else display('cvtbanner: unhandled escape string \\'+b[i]+'\n');
  232.    }
  233.   return x;
  234. }
  235.  
  236. if (! isnull(amap_ident))
  237.  foreach p (keys(amap_ident))
  238.  {
  239.   port = int(p);
  240.   if (amap_proto[p] == "tcp")
  241.   {
  242.    soc = open_sock_tcp(port);
  243.    if (soc)
  244.     close(soc);
  245.    else
  246.     security_hole(port: port, data: "Either this port is dynamically allocated
  247. or amap killed this service.
  248. If so, upgrade it!
  249.  
  250. Risk : None / High\n");
  251.   }
  252.   id = amap_ident[p];
  253.   if (id && id != "unidentified" && id != 'ssl')
  254.   {
  255.    security_note(port: port, proto: amap_proto[p], data: "Amap has identified this service as " + id);
  256.    set_kb_item(name: "Amap/"+proto+"/"+port+"/Svc", value: id);
  257.   }
  258.  
  259.   banner = cvtbanner(b: amap_print_banner[p]);
  260.   set_kb_item(name: "Amap/"+proto+"/"+port+"/PrintableBanner", value: banner);
  261.  
  262.   banner = cvtbanner(b: amap_full_banner[p]);
  263.   set_kb_item(name: "Amap/"+proto+"/"+port+"/FullBanner", value: banner);
  264.  }
  265.